import re
import logging
import jieba
from pypinyin import pinyin, Style

# 获取logger
logger = logging.getLogger(__name__)

class KubernetesCommandParser:
    def __init__(self):
        logger.debug("初始化KubernetesCommandParser")
        
        # 定义支持的K8S操作和关键词
        self.supported_actions = {
            'create': ['创建', '新建', '建立', '添加', '新增', '制作'],
            'delete': ['删除', '移除', '去掉', '销毁', '清除', '干掉'],
            'get': ['查看', '显示', '列出', '查询', '获取', '看看'],
            'update': ['更新', '修改', '改变', '调整', '编辑', '改动'],
            'describe': ['描述', '详情', '详细信息', '详细'],
            'apply': ['应用', '部署', '执行']
        }
        
        self.supported_resources = {
            'namespace': ['命名空间', '名称空间', 'namespace', 'ns', '空间'],
            'pod': ['容器', 'pod', 'Pod', 'pods', '容器组'],
            'deployment': ['部署', 'deployment', 'Deployment', 'deploy', '应用部署'],
            'service': ['服务', 'service', 'Service', 'svc', '服务发现'],
            'pv': ['持久卷', 'pv', 'PV', 'persistentvolume', '存储卷'],
            'pvc': ['持久卷声明', 'pvc', 'PVC', 'persistentvolumeclaim', '存储声明'],
            'storageclass': ['存储类', 'storageclass', 'StorageClass', 'sc', 'SC', '存储类别'],
            'ingress': ['入口', 'ingress', 'Ingress', '网络入口', '访问入口'],
            'configmap': ['配置映射', 'configmap', 'ConfigMap', 'cm', 'CM', '配置文件'],
            'secret': ['密钥', 'secret', 'Secret', '密码', '凭证'],
            'role': ['角色', 'role', 'Role', '权限角色'],
            'rolebinding': ['角色绑定', 'rolebinding', 'RoleBinding', 'rb', 'RB', '绑定角色'],
            'serviceaccount': ['服务账户', 'serviceaccount', 'ServiceAccount', 'sa', 'SA', '账户']
        }

        # 构建关键词模式，用于从文本中移除这些词
        self.all_keywords = self.get_all_keywords()

    def convert_chinese_to_pinyin(self, text):
        """将中文文本转换为拼音"""
        if not text or not isinstance(text, str):
            return text
        
        # 只转换中文字符，保留其他字符
        result = []
        for char in text:
            if '\u4e00' <= char <= '\u9fff':  # 判断是否为中文字符
                pinyin_list = pinyin(char, style=Style.NORMAL)
                if pinyin_list:
                    result.append(pinyin_list[0][0])
            else:
                result.append(char)
        
        return ''.join(result)

    def extract_resource_name(self, text, action, resource):
        """智能提取资源名称"""
        logger.debug(f"提取资源名称: text={text}, action={action}, resource={resource}")
        
        # 移除动作词和资源词
        clean_text = text
        for keyword in self.all_keywords:
            clean_text = clean_text.replace(keyword, ' ')
        
        # 移除常见修饰词
        modifiers = ['一个', '的', '叫', '名为', '名字为', '给', '这个', '那个']
        for modifier in modifiers:
            clean_text = clean_text.replace(modifier, ' ')
        
        # 移除标点符号和多余空格
        clean_text = re.sub(r'[^\w\s\u4e00-\u9fff]', ' ', clean_text)
        clean_text = re.sub(r'\s+', ' ', clean_text).strip()
        
        logger.debug(f"清理后的文本: '{clean_text}'")
        
        # 如果清理后还有内容，返回第一个词
        if clean_text:
            # 按空格分割，取第一个非空词
            parts = clean_text.split()
            if parts:
                return parts[0]
        
        return None

    def get_all_keywords(self):
        """获取所有关键词"""
        keywords = []
        for action_list in self.supported_actions.values():
            keywords.extend(action_list)
        for resource_list in self.supported_resources.values():
            keywords.extend(resource_list)
        return list(set(keywords))

    def parse_command(self, voice_text):
        """解析语音指令 - 改进版"""
        logger.debug(f"开始解析语音指令: {voice_text}")
        
        result = {
            'original_text': voice_text,
            'action': None,
            'resource': None,
            'resource_name': None,
            'pinyin_name': None,
            'is_valid': False,
            'error': None,
            'details': {}
        }
        
        try:
            # 1. 识别操作类型
            for action, keywords in self.supported_actions.items():
                if any(keyword in voice_text for keyword in keywords):
                    result['action'] = action
                    logger.debug(f"识别到动作: {action}")
                    break
            
            # 2. 识别资源类型
            for resource, keywords in self.supported_resources.items():
                if any(keyword in voice_text for keyword in keywords):
                    result['resource'] = resource
                    logger.debug(f"识别到资源类型: {resource}")
                    break
            
            # 3. 对于需要名称的操作，提取资源名称
            if result['action'] in ['create', 'delete', 'update']:
                name = self.extract_resource_name(
                    voice_text, 
                    result['action'], 
                    result['resource']
                )
                
                logger.debug(f"提取到的名称: {name}")
                
                if name and name not in self.all_keywords:  # 确保不是关键词
                    result['resource_name'] = name
                    result['pinyin_name'] = self.convert_chinese_to_pinyin(name)
                    result['is_valid'] = True
                    logger.debug(f"名称转换: {name} -> {result['pinyin_name']}")
                else:
                    result['error'] = '未找到有效的资源名称'
                    logger.warning(f"未找到有效的资源名称: {name}")
            elif result['action'] in ['get', 'apply', 'describe']:
                # 查看和应用操作可以没有具体名称
                result['is_valid'] = True
                logger.debug("指令解析成功(无名称操作)")
            else:
                result['error'] = '不支持的操作类型或缺少操作类型'
                logger.warning(f"指令解析失败: {result['error']}")
                
        except Exception as e:
            result['error'] = f'指令解析错误: {str(e)}'
            logger.error(f"指令解析异常: {str(e)}", exc_info=True)
        
        logger.debug(f"最终解析结果: {result}")
        return result

# 单例实例
command_parser = KubernetesCommandParser()